//4083:我爱北大
/*
描述
“红楼飞雪，一时英杰……”耳边传来了那熟悉的歌声。而这，只怕是我最后一次听到这个声音了。

想当年，我们曾经怀着豪情壮志，许下心愿，走过静园，走过一体，走过未名湖畔的每个角落。

想当年，我们也曾慷慨高歌，瞻仰民主与科学，瞻仰博雅塔顶，那百年之前的遗韵。

没错，我爱北大，我爱这个校园。

然而，从当我们穿上学位服的那一刻起，这个校园，就再也不属于我。它只属于往事，属于我的回忆。

没错，这，是我在北大的最后一日。此时，此景，此生，此世，将刻骨难忘。

再也没有了图书馆自习的各种纷纭，再也没有了运动场上的挥汗如雨，有的，只是心中永远的不舍，与牵挂。

夜，已深。人，却不愿离去。天边有一颗流星划过，是那般静，宁谧。

忍不住不回头，我的眼边，有泪光，划过。

这时候，突然有一位路人甲从你身旁出现，问你：从XX到XX怎么走？

索性，就让我再爱你一次。因为，北大永远在你心中。北大的地图，永远在你的心中。

轻手挥扬，不带走一分云彩。

输入
输入分为三个部分。
第一个部分有P+1行，第一行为一个整数P，之后的P行表示北大的地点。地点长度不超过20个字符。
第二个部分有Q+1行，第一行为一个整数Q，之后的Q行每行分别为两个字符串与一个整数，表示这两点有直线的道路，并显示二者之间的矩离（单位为米）。
第三个部分有R+1行，第一行为一个整数R，之后的R行每行为两个字符串，表示需要求的路线。
p<=30,Q<=50,R<=20
输出
输出有R行，分别表示每个路线最短的走法。其中两个点之间，用->(矩离)->相隔。
*/

#include<iostream>
#include<string>
#include<stack>

using namespace std;

#define MAXV 33
#define INF 1<<29
int v, e;
int g[MAXV][MAXV];
int pre[MAXV][MAXV];
std::string name[MAXV];
stack<int>path;

void floyd()
{
    int i, j, k;
    for (k = 1; k <= v; k++)
    {
        for (i = 1; i <= v; i++)
        {
            for (j = 1; j <= v; j++)
            {
                if (g[i][j] > g[i][k] + g[k][j])
                {
                    g[i][j] = g[i][k] + g[k][j];
                    pre[i][j] = pre[k][j];
                }
            }
        }
    }
}
int getIndex(string str)
{
    int i;
    for (i = 1; i <= v; i++)
    {
        if (str == name[i])
        {
            return i;
        }
    }
    return -1;
}

int main()
{
    int i, j;
    cin >> v;
    for (i = 1; i <= v; i++)
    {
        for (j = 1; j <= v; j++)
        {
            g[i][j] = (i == j ? 0 : INF);
            pre[i][j] = -1;
        }
    }
    string str;

    /*读入并存入名字*/
    for (i = 1; i <= v; i++)
    {
        cin >> str;
        name[i] = str; //向map中插入数据
    }
    cin >> e;
    string f, t;
    int fi, ti;
    int w;
    for (i = 1; i <= e; i++)
    {
        cin >> f >> t >> w; //from to weight

        fi = getIndex(f);
        ti = getIndex(t);
        if (w < g[ti][fi] && w < g[fi][ti])
        {
            g[ti][fi] = g[fi][ti] = w;//双向
            pre[fi][ti] = fi;//初始化前驱
            pre[ti][fi] = ti;
        }// else有重边
    }
    floyd();

    int c;//测试用例
    cin >> c;
    while (c--)
    {
        cin >> f >> t;
        fi = getIndex(f);
        ti = getIndex(t);
        path.push(ti);//压入终点值
        int nti;//新的终点值
        while (pre[fi][ti] != -1)
        {
            ti = pre[fi][ti];
            path.push(ti);
        }
        while (!path.empty())
        {
            fi = path.top();
            path.pop();
            if (path.size() == 0)
            {
                break;
            }
            ti = path.top();
            cout << name[fi] << "->(";
            cout << g[fi][ti] << ")->";
        }
        cout << name[ti];
        cout << endl;
    }
    return 0;
}

//Accepted
